package bd.project;



import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;


public class DAO {

    ConexionBD conexion;
    String dato="";
    private final String driver     = "org.postgresql.Driver";
    private final String name_dir   = "jdbc:postgresql://localhost:5433/f";
    private final String user_db    = "postgres";
    private final String pass_db    = "univalle";
    private Connection con;
    private PreparedStatement pst;
    
    /**
    * Constructor que realiza la conexion cuando se instancia un objeto Conexion
    */
    
    public DAO() {
        conexion = new ConexionBD();
        //en cada DAO se crea un objeto de tipo ConexionBD
        try {    
            // Driver de conexion, en este caso estoy utilizando el de
            // postgresql

            Class.forName(driver);
            // Creo una conexion con la base de datos a partir de los datos de conexion
            con = DriverManager.getConnection(name_dir, user_db, pass_db);
        } catch (Exception e) {
            //Si ocurre un error lo capturo
            e.printStackTrace();
        }
    }

    public void conectar(){
        try {
            // Driver de conexion, en este caso estoy utilizando el de
            // postgresql
            Class.forName(driver);
            // Creo una conexion con la base de datos a partir de los datos de conexion
            con = DriverManager.getConnection(name_dir, user_db, pass_db);
            System.out.println("Conectado a la base de datos");
        } catch (Exception e) {
            //Si ocurre un error lo capturo
            e.printStackTrace();
            System.out.println("No te has conectado a la base de datos");
        }
    }

    public void consulta(String sql) {
        
        System.out.println("Consulta : " + sql + "\n"); // Declaracion en null del resultSet
        try {
            int registros = 0; //Variable para contar los registros
            pst = con.prepareStatement(sql); //Preparo la sentencia sql a ejecutar
            ResultSet rs = pst.executeQuery(); //Obtengo los datos de la consulta en un resultset
            //Guardo los datos del ResultSet en un ResultSetMetadata para jugar un poco mas
            ResultSetMetaData rsm = rs.getMetaData();
            
            //Obtengo los nombres de las columnas: D
            for (int i = 1; i <= rsm.getColumnCount(); i++) {
                System.out.print("" + rsm.getColumnName(i) + " | ");
               dato+="" + rsm.getColumnName(i) + " | ";
            }
            
            System.out.println("");
            
            while(rs.next()){
                dato +="\n";
                for (int i = 1; i <= rsm.getColumnCount(); i++) {
                    System.out.print(rs.getString(i) + " | ");
                    
                    dato+="" + rs.getString(i) + " | ";
                }
                
                registros++;
                System.out.println("");
            }
            
            System.out.println("\nCantidad de registros : " + registros);
            System.out.println("------------------------------------------------- \n");
            pst.close(); //Libero los datos del PreparedStatement, automaticamente tambien se libera el ResultSet
        
        } catch (SQLException e) {
            e.printStackTrace(); // Capturo la excepcion en caso de error
        }
        
    }

    public Usuario consultarUsuario(String login) {

        Usuario objUsuario = new Usuario();
        String sql;
        sql = "SELECT* FROM Usuarios WHERE login='" + login + "';";

        try {

            con = conexion.conectar();
            Statement sentencia = con.createStatement();
            ResultSet rs = sentencia.executeQuery(sql);

            while (rs.next()) {
                objUsuario.setLogin(rs.getString(1));
                objUsuario.setPasword(rs.getString(2));
                objUsuario.setRol(rs.getString(3));
                
            }

            return objUsuario;
        } catch (SQLException exp) {
        }
        return null;
    }
    
    
    public String getDato() {
        return dato;
    }

    public void setDato(String dato) {
        this.dato = dato;
    }
    
    public void sentencia(String sql) {
        System.out.println("Sentencia : " + sql + "\n"); // Declaracion en null del resultSet
        try{
            pst = con.prepareStatement(sql); //Preparo la sentencia sql a ejecutar
            int registros = pst.executeUpdate(); //Obtengo los datos de la consulta - Cuento los registros afectados
            System.out.println("\nCantidad de registros afectados : " + registros);
            System.out.println("------------------------------------------------- \n");
            pst.close(); //Libero los datos del PreparedStatement, automaticamente tambien se libera el ResultSet
        
        } catch (SQLException e) {
            e.printStackTrace(); // Capturo la excepcion en caso de error
        }
    }
    
    /**
    * Metodo que permite cerrar la conexion realizada a la BD
    */
    
    public void desconectar() {
        try {
            //Cierro todas las conexiones con la base de datos
            //Automaticamente libero memoria y cierro las conexiones abiertas en el objeto Connection
            con.close();
            
        } catch (Exception e) {
            // Controlo cualquier excepcion generada durante el cierre de la conexion
            e.printStackTrace();
        }
    }

}
